4626622 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

おびやまロボット研究所 ~マイコン電子工作と自作ドローン~

おびやまロボット研究所 ~マイコン電子工作と自作ドローン~

微弱無線モジュール

昨年度に買ったこれ↓
http://strawberry-linux.com/catalog/items?code=82003
http://strawberry-linux.com/catalog/items?code=82004

使ってみました。
まずは、Arduinoから、デジタル信号を周期的にON-OFFさせて無線で送信、
同じArduinoで受信してLEDを点滅させてみました。
目視だと問題なく点滅してる。
ただ、微妙にノイズが乗ってる感じがするかも。

  • CIMG6008.JPG


  • 次に、USB-シリアルポートを使ってシリアル信号を無線で送信、
    Arduino側で受信うまくいかない、(削除)
    何も送らなくても不規則な値のら列を受信し続けています。やっぱりノイズを適当に解釈して受信し続けているようです。
    やはり、シリアルポートを直接使って送受信することはできないようです。
    プログラムでノイズを判別して、誤り検出を含めてデータ送受信する必要がありそうで、ちょっと面倒ですね。

  • CIMG6020.JPG



----------------------------------------------

昨日の続き。
素直に動かないのでオシロで信号を確認。
信号なしの場合、ミリ秒オーダーのノイズがひっきりなしに出てる。
これにシリアル信号乗せても判別できるはずがない。
おもいっきり速度を下げて300bpsで大文字の”U"、コードはバイナリで01010101を連続して送ってみると認識されたのがこちら↓

  • scopyU.jpg


  • 速度を倍の600bps以上に上げると、信号にこんな風に隙間が開く。(この間にノイズが入ったらダメになるかもしれない?)

  • scopyU600.jpg


1200bpsだと、信号の最初がなまって読み取れない。

  • scopyU1200.jpg


つまり、300bpsまたは600bpsでソフト的に送り方を工夫してエラー処理を行えば送信できそうではある。


----------------------------------------------

プログラム作って送受信してみました。
アドレスとコマンドとして2バイトのデータを送るとして、アドレスとコマンドの和をチェックサムとし、ヘッダとデリミタをつけて送ります。
受信側ではデリミタを監視して、受信したらそこまでのデータのヘッダを探してその後の2バイト抜き取ってチェックサムが正しければOKとしました。
ノイズの影響で1度で確実に送れませんが、数回送れば受信できるので、これにて終了。

  • RFmodule.jpg



----------------------------------------------

参考URL
http://www.sparkfun.com/products/8945
http://strawberry-linux.com/images/tx-ask315.jpg
http://winavr.scienceprog.com/example-avr-projects/running-tx433-and-rx433-rf-modules-with-avr-microcontrollers.html

----------------------------------------------
Arduinoのスケッチ
送信側


byte hder, delim;
byte adr, cmd;

void setup()
{
Serial.begin(600); //

hder=0xff;
delim=0x00;
}

void loop()
{

adr=0x01;
cmd=0x02;

Serial.write(hder);
Serial.write(adr); // adr,cmd ともdelimと異なること!
Serial.write(cmd);
Serial.write(adr+cmd); // adrとcmdの和が255を越えないこと!
Serial.write(delim);
delay(1000);
}


----------------------------------------------

Arduinoのスケッチ
受信側



byte str[90]; // string buffer
int adr, cmd, sum;
byte hder, delim;


void recvStr(byte *buf)
{
int i = 0;
byte c;
while (1) {
if (Serial.available()) {
c=Serial.read();
buf[i] = c;
if (c ==delim ) break;
i++;
}
}
}

void setup()
{
Serial.begin(600);

hder=0xff;
delim=0x00;

}

void loop()
{
int cnt, i;

if (Serial.available() > 0){
recvStr(str);
i=0; cnt=0;
while(str[i]!= hder) i++; // char strに0xffを入れて比較に使うと-1になるので
adr=(int)str[i+1];
cmd=(int)str[i+2];
sum=(int)str[i+3];
if ((adr+cmd)==sum && sum!=0) { // adrもcmdも0の時があるので除外
Serial.print("adr:"); Serial.println(adr);
Serial.print("cmd:"); Serial.println(cmd);
}
}
}


© Rakuten Group, Inc.